<?php
if( !defined('CORE') ) exit('Request Error!');
/**
 * 版本：1.0
 * 作者：Lane<61647649@qq.com>
 * 日期：2015-12-31
 * 内容：重写session
 */

/**
 * gc回收函数， 传入的参数是最大的生命周期
 * 我们可以根据时间，来决定unlink一些文件
 * 此函数调用是有概率的，概率是
 * session.gc_probability/session.gc_divisor
 */
ini_set('session.gc_divisor', config('SESSION_GC_DIVISOR'));
ini_set('session.gc_probability',config('SESSION_GC_PROBABILITY'));

//session类型， 如果使用memcache，直接由系统受理，PHP自带支持memcache的session模式
if( config('SESSION_TYPE')  == 'memcache' )
{
    ini_set('session.save_handler', 'memcache');
    $host = config('SESSION_CACHE_HOST'); 
    ini_set('session.save_path', $host[0]."/".config('CACHE_PREFIX'));
}
else if ( config('SESSION_TYPE') == 'file') // 用文件缓存来处理session
{
    // 在每次初始化之前先关闭session，然后重新设置
    session_write_close();
    // 设置session文件的存储地址
    session_save_path( PATH_CACHE );
    // 设置session处理函数
    session_set_save_handler("session::init", "session::close", "session::read",  "session::write", "session::destroy", "session::gc");
}
else if (config('SESSION_TYPE') == 'mysql') // 用mysql来处理session
{
    session_write_close();
    session_set_save_handler("session::init", "session::close", "session::read",  "session::write", "session::destroy", "session::gc");
}
else 
{
    // 默认走自带的session处理
}

/**
 * session接口类
 *
 * @author itprato<2500875@qq>
 * @version $Id$  
 */   
class session
{  
    //session cookie name
    private static $session_name = '';
    
    //session_path
    private static $session_path = '';
    
    //session_id
    private static $session_id   = '';
    
    //session_live_time
    private static $session_live_time = 3600;
    
    //session类型 file || mysql
    private static $session_type = '';
    
    // session控制处理语柄
    private static $fc_handler   = NULL;
    

    // 不可初始化不可复制
    private function __construct() {}
    private function __clone() {}
   
    /**
     * session_start() 函数调用后执行此函数
     * @param $save_path 自动传入session存储的地址
     * @param $cookie_name 客户端通过cookie传递过来的sessionid指定的名字（默认PHPSESSION）
     */
    public static function init($save_path, $cookie_name)
    {
        self::$session_name = $cookie_name;
        self::$session_path = $save_path;
        self::$session_id   = session_id();
        self::$session_type = config('SESSION_TYPE') ;
       // self::$session_live_time = empty(config('SESSION_LIVE_TIME')) ? config('SESSION_LIVE_TIME') : config('SESSION_LIVE_TIME');
        self::$session_live_time =  ini_get('session.gc_maxlifetime') ;
        if( self::$session_type == 'file' ) 
        {
            self::$fc_handler = cls_filecache::factory( self::$session_path.'/session_data' );
        }
        elseif (self::$session_type == 'mysql') 
        {
            // 暂时没写
            self::$fc_handler = new cls_mysqlsession();
        }

        return true;
    }
    
   
     /**
     * 根据session_id 读取session_id指向的文件或者内存中存储的数据
     * 切记此函数返回格式，必须跟write时存储的格式一致，否则session获取为空
     * 当从session中获取数据的时候，调用此函数
     */
    public static function read( $session_id )
    {
        return self::$fc_handler->get( $session_id );
    }

   
     /**
     * 将sess_data 存储到session_id指向的空间中(可以是文件也可以是内存)
     * 当往session中写入数据的时候调用此函数
     */
    public static function write($session_id, $sess_data)
    {
        return self::$fc_handler->set( $session_id, $sess_data, self::$session_live_time );
    }

   
    /**
     * 消除session_id指定的session文件或者内存空间,  做delete工作
     * 当调用session_destroy函数的时候调用此函数
     */
    public static function destroy( $session_id )
    {
        return self::$fc_handler->delete( $session_id );
    }

  
     /**
     * gc回收函数， 传入的参数是最大的生命周期
     * 我们可以根据时间，来决定unlink一些文件
     * 此函数调用是有概率的，概率是
     * session.gc_probability/session.gc_divisor
     * 这个函数是概率调用，并不是什么时候都调用的
     */
    public static function gc($max_lifetime)
    {
        //echo '<pre>';print_r('gc:' . $max_lifetime);echo '</pre>';
        // 这里不用做任何事情，因为你本来就是存储到缓存里面的，缓存本身就可以自动到期就删除了, 如果是文件存储一般做下面的事
        //global $sess_save_path;
        //foreach (glob("$sess_save_path/sess_*") as $filename) {
        //if (filemtime($filename) + $maxlifetime < time()) {
        //@unlink($filename);
        //}
        //}

        return true;
    }

   /**
    * 关闭接口（页面结束会执行）
    */
    public static function close()
    {
        if( self::$fc_handler )
        {
            if( empty(self::$session_live_time) ) 
            {
                self::$fc_handler->delete( self::$session_id );
            }
            self::$fc_handler->close();
        }
    }

}


